package cz.vse.po1715.piskorky;

import cz.vse.po1715.piskorky.sit.hra.IHra;
import cz.vse.po1715.piskorky.sit.sit.Sit;
import cz.vse.po1715.piskorky.umela_inteligence.UměláInteligence;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/*******************************************************************************
 * Instance třídy {@code TestAiSit} představují ...
 *
 * @author    Vladimír FOREJT
 * @version   0.00.000
 */
public class TestAiSit implements IHra{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
    //private final String IP_ADDR = "192.168.252.182";
    private final String IP_ADDR = "localhost";
    
    private final Point rozměrPole = new Point (15,15);
    
    /** Hlavní okno */
    private final JFrame appWindow = new JFrame("První okno");
    
    /** Hrací pole */
    private final JPanel hracíPole = new JPanel();
    
    /** Panel s ovládáním */
    private final JPanel ovládání = new JPanel();
    
    /**List Políček */
    private final List<JButton> políčka;
    
    private final int početPolí;
    
    private final JButton hraj = new JButton("Další tah");
    
    private final JButton spusťServer = new JButton ("Spusť server");
    
    private final JButton připojSe = new JButton ("Připojit");
   
    private final ActionListener síťBtnListener = new SíťBtnListener();
    
    /** Posluchač události stisku tlačítka v panelu. */
    private final ActionListener listener = new ButtonListener();
    
   
    
    /** Instance umělé inteligence */
    private final UměláInteligence ai;
    
    private final Sit sit;
    
    Point vlastníTah;
    Point cizíTah;
    
    private final String znakServer = "X";
    private final String znakKlient = "O";
    private String vlastníZnak;
    private String cizíZnak;
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
    
    //* počet odehraných tahů - pomocná proměnná pro střídání hráčů */
    private int početTahů = 0;
    
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================
    /***************************************************************************
     *
     */
    public TestAiSit() {
        sit = new Sit();
        sit.setHra(this);
        spusťServer.addActionListener(síťBtnListener);
        připojSe.addActionListener(síťBtnListener);
        
        
        
        ai = new UměláInteligence(rozměrPole);
        početPolí = rozměrPole.x * rozměrPole.y;
        
        vlastníTah = ai.napověz();
        
        políčka = new ArrayList<JButton>(početPolí);
        //Připravit vrchní část s hracím polem
        hracíPole.setLayout(new GridLayout(rozměrPole.x, rozměrPole.y));
        for(int i = 0; i < početPolí; i++) {
            JButton políčko = new JButton(" ");
            políčko.setSize(10, 10);
            políčka.add(políčko);
        }
        for(JButton políčko : políčka) {
            hracíPole.add(políčko);
        }
        //Spodní část s ovládáním
        hraj.addActionListener(listener);
        
        ovládání.add(spusťServer);
        ovládání.add(připojSe);
        ovládání.add(hraj);
        
        appWindow.add(hracíPole, BorderLayout.NORTH);
        appWindow.add(ovládání, BorderLayout.SOUTH);
        appWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        appWindow.pack();
        appWindow.setVisible(true);
        
    }
//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
    
    @Override
    public void zpracujTah(int x, int y) {
        cizíTah = new Point(x,y);
        int indexCizí = ai.souřadnice2index(cizíTah);
        políčka.get(indexCizí).setText(cizíZnak);
        vlastníTah = ai.hraj(cizíTah);
    }
    @Override
    public void zpracujZpravu(String zprava){
         System.out.println("Zpráva od protihráče : " + zprava);
    }
    @Override
    public void odesliTah(int x, int y){
         sit.odesliTah(x, y);
    }
    @Override
    public void odesliZpravu(String zprava){
         sit.odesliZpravu(zprava);
    }

    @Override
    public void vypisZpravu(String zprava){
         System.out.println(zprava);
    }
    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
    
    /***************************************************************************
     * Posluchač reagující na stisk tlačítka tím,
     * že vyvolá příkaz s názvem tlačítka jako jeho parametrem.
     */
    private class ButtonListener implements ActionListener
    {
        /***********************************************************************
         * Zadá příkaz, jehož parametrem bude nápis na tlačítku.
         *
         * @param event Ohlášená událost, od níž zjistíme nápis na tlačítku
         */
        @Override
        public void actionPerformed(ActionEvent event)
        {
            odesliTah(vlastníTah.x, vlastníTah.y);
            int indexVlastní = ai.souřadnice2index(vlastníTah);
            políčka.get(indexVlastní).setText(vlastníZnak);
            
                        
        }

    }
    
    /***************************************************************************
     * Posluchač reagující na stisk tlačítka tím,
     * že vyvolá příkaz s názvem tlačítka jako jeho parametrem.
     */
    private class SíťBtnListener implements ActionListener
    {
        /***********************************************************************
         * Zadá příkaz, jehož parametrem bude nápis na tlačítku.
         *
         * @param event Ohlášená událost, od níž zjistíme nápis na tlačítku
         */
        @Override
        public void actionPerformed(ActionEvent event)
        {
            String název = event.getActionCommand();
            if(název.equalsIgnoreCase("Spusť server")) {
                sit.spustServer();
                vlastníZnak = znakServer;
                cizíZnak = znakKlient;
            } else if (název.equalsIgnoreCase("Připojit")) {
                sit.pripojSeKServeru(IP_ADDR);
                vlastníZnak = znakKlient;
                cizíZnak = znakServer;
            }  
        }

    }
    
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
    public static void test()
    {
        TestAiSit inst = new TestAiSit();
    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {  test();  }
}
